//
// Created by YeMingMing on 2024-03-06.
//


// 约瑟夫环问题-2

#include <stdio.h>

#define N 10 // 假设N为10

int main() {
    int a[N + 1]; // 定义数组a，大小为N+1，存储N个人的编号
    int *p = a, i, j, k;

    // 初始化数组a，存储1至N的编号
    for (i = 0; i < N + 1; i++) {
        *(p + i) = i;
    }

    k = N; // 初始剩余的人数为N
    j = 3;

    // 约瑟夫环算法
    for (i = 0; k != 1; p++) {
        if (p == (a + N + 1)) // 如果指针超出数组范围，则将其指向数组的起始位置
            p = a + 1;
        if (*p != 0) // 如果当前位置不为0（表示这个位置的人还在圈内）
            i++;
        if (i == j) { // 如果数到了间隔数k
            k--; // 更新剩余的人数
            i = 0; // 重置i为0
            *p = 0; // 将当前位置的人移除
        }
    }

    // 打印最后剩下的人
    for (i = 0; i < N + 1; i++) {
        if (a[i] != 0) // 如果数组中的值不为0（表示这个位置的人还在圈内）
            printf("%d ", a[i]); // 输出这个人的编号
    }

    return 0;
}

